898C - Phone Numbers - CodeForces Solution


implementation strings *1400

Please click on ads to support us..

Python Code:

from collections import defaultdict
import sys, os, io
input = io.BytesIO(os.read(0, os.fstat(0).st_size)).readline

n = int(input())
d = defaultdict(lambda : set())
for _ in range(n):
    x = list(input().rstrip().decode().split())
    u = x[0]
    for i in x[2:]:
        d[u].add(i)
ans = []
for i in d.keys():
    x = list(d[i])
    y = []
    for u in x:
        c = 0
        for v in x:
            if len(u) > len(v):
                continue
            f = 1
            for j in range(1, min(len(u), len(v)) + 1):
                if not u[-j] == v[-j]:
                    f = 0
                    break
            if f:
                c += 1
        if c == 1:
            y.append("".join(u))
    ans0 = [i, str(len(y))] + y
    ans.append(" ".join(ans0))
m = len(ans)
print(m)
sys.stdout.write("\n".join(ans))

C++ Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5;
ll trie[22][N][27],cnt[22],pos[22][N],k[22];
map<string,ll>mp;
map<ll,string>mpp;
string A[N][N];
vector<string>ans[N];
void insert(string s,ll id)
{
	ll p=0;
	ll len=s.length();
	for(ll i=len-1;i>=0;i--)
	{
		pos[id][p]=2; 
		ll x=s[i]-'0';	
		if(trie[id][p][x]==0)trie[id][p][x]=++cnt[id];
		p=trie[id][p][x];
	//	cout<<trie[id][1][2]<<" ";
		
	}	
	if(pos[id][p]!=2)pos[id][p]=1;
	 
}
void find(string s,ll id)
{
	ll p=0;
	ll len=s.length();
	for(ll i=len-1;i>=0;i--)
	{
		ll x=s[i]-'0';	
		p=trie[id][p][x];
	}	
	if(pos[id][p]!=2)
	{
		pos[id][p]=2;
		ans[id].push_back(s);
	}
}
int main()
{
	ll tot=0;
	ll n;
	cin>>n;
	for(ll i=1;i<=n;i++)
	{
		string s;
		cin>>s;
		if(mp[s]==0) mp[s]=++tot,mpp[tot]=s;
		ll ss;
		cin>>ss;
		while(ss--)
		{
			string s1;
			cin>>s1;
	    A[mp[s]][++k[mp[s]]]=s1;
		ll dd=mp[s];
		insert(s1,dd);
		}
	}
	for(ll i=1;i<=tot;i++)
	{
		for(ll j=1;j<=k[i];j++)
		{
			find(A[i][j],i); 
		}
	}
	cout<<tot<<endl;
	for(ll i=1;i<=tot;i++)
	{
		cout<<mpp[i]<<" "<<ans[i].size()<<" ";
		for(auto ss: ans[i])
		{
			cout<<ss<<" ";			
		}
		cout<<endl;
	}
}
						 	   		  	 			 	     		


Comments

Submit
0 Comments
More Questions

1302. Deepest Leaves Sum
1209. Remove All Adjacent Duplicates in String II
994. Rotting Oranges
983. Minimum Cost For Tickets
973. K Closest Points to Origin
969. Pancake Sorting
967. Numbers With Same Consecutive Differences
957. Prison Cells After N Days
946. Validate Stack Sequences
921. Minimum Add to Make Parentheses Valid
881. Boats to Save People
497. Random Point in Non-overlapping Rectangles
528. Random Pick with Weight
470. Implement Rand10() Using Rand7()
866. Prime Palindrome
1516A - Tit for Tat
622. Design Circular Queue
814. Binary Tree Pruning
791. Custom Sort String
787. Cheapest Flights Within K Stops
779. K-th Symbol in Grammar
701. Insert into a Binary Search Tree
429. N-ary Tree Level Order Traversal
739. Daily Temperatures
647. Palindromic Substrings
583. Delete Operation for Two Strings
518. Coin Change 2
516. Longest Palindromic Subsequence
468. Validate IP Address
450. Delete Node in a BST